/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.unipar.oficina.validadores;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.faces.validator.FacesValidator;

/**
 * Validação de CNPJ.
 *
 * @author Thiago Marques
 */
@FacesValidator("validadorCNPJ")
public class ValidadorCNPJ implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent arg1, Object valorTela) throws ValidatorException {
        if (!validaCNPJ(String.valueOf(valorTela))) {
            FacesMessage message = new FacesMessage();
            message.setSummary("CPNJ inválido");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
        }
    }
    
    private static final int[] pesoCNPJ = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};

    private static int calculaDigito(String str, int[] peso) {
        int soma = 0;
        for (int indice = str.length() - 1, digito; indice >= 0; indice--) {
            digito = Integer.parseInt(str.substring(indice, indice + 1));
            soma += digito * peso[peso.length - str.length() + indice];
        }
        soma = 11 - soma % 11;
        return soma > 9 ? 0 : soma;
    }

    public static boolean validaCNPJ(String cnpj) {
        if (cnpj != null) {
            cnpj = cnpj.replace(".", "").replace("/", "").replace("-", "");
        }
        if (cnpj == null) {
            return true;
        }
        if (cnpj.equals("null")) {
            return true;
        }
        if (cnpj.equals("")) {
            return true;
        }
        if (cnpj.length() == 0) {
            return true;
        } else if (cnpj.length() > 0 && cnpj.length() < 14) {
            return false;
        } else if (cnpj.length() != 14) {
            return false;
        }
        Integer digito1 = calculaDigito(cnpj.substring(0, 12), pesoCNPJ);
        Integer digito2 = calculaDigito(cnpj.substring(0, 12) + digito1, pesoCNPJ);
        return cnpj.equals(cnpj.substring(0, 12) + digito1.toString() + digito2.toString());
    }
}
